home *** CD-ROM | disk | FTP | other *** search
- #include "DeskLib:Sprite.h"
- #include "DeskLib:SWI.h"
- #include "DeskLib:GFX.h"
- #include "DeskLib:Screen.h"
- #include "DeskLib:WimpSWIs.h"
-
- #include "Shell.SafeAlloc.h"
- #include "Shell.Printf.h"
- #include "Shell.Shell.h"
-
- #include "Shell.SpriteRect.h"
-
-
-
-
- const Shell_convertpoint Shell_nullconvert = { 0, 0};
-
- typedef struct {
- sprite_areainfo *areainfo;
- union {
- sprite_header *header;
- char *name;
- }
- sprite;
- }
- Shell_spriteblock;
-
-
-
-
-
- static sprite_outputstate oldstate;
- static void *savebuffer;
-
-
-
-
-
- void Shell_RedirectToSprite( Shell_rectblock *rectblock)
- {
- Shell_spriteblock *spriteblock = (Shell_spriteblock *) rectblock->reference;
- int savesize;
-
- /* Find size of savebuffer. */
-
- SWI( 3, 4, SWI_OS_SpriteOp,
- 256+62, spriteblock->areainfo, spriteblock->sprite.name,
- NULL, NULL, NULL, &savesize
- );
-
- savebuffer = Shell_SafeCalloc( 1, savesize);
- /* Must be calloc, otherwise 'invalid save area' is returned by Sprite_Redirect. */
- /* presumably because the alloc-ed block is set to 0 by calloc... */
-
- Sprite_Redirect( (sprite_area) spriteblock->areainfo, spriteblock->sprite.name, savebuffer, &oldstate);
-
- return;
- }
-
-
-
- void Shell_UnRedirect( void)
- {
- Sprite_UnRedirect( &oldstate);
- free( savebuffer);
- return;
- }
-
-
-
-
- static void Shell__SpriteRedrawer(
- Shell_convertpoint convert,
- wimp_point rectsize,
- void *reference,
- const wimp_rect *redrawrect
- )
- {
- Shell_spriteblock *spriteblock = (Shell_spriteblock *) reference;
- UNUSED( redrawrect);
- UNUSED( rectsize);
- Sprite_Plot( spriteblock->areainfo, spriteblock->sprite.name, convert.x, convert.y, plot_SOLIDBOTH);
- return;
- }
-
-
-
-
-
- static BOOL Shell__SpriteRectSaver( char *filename, Shell_rectblock *r)
- {
- Shell_spriteblock *spriteblock = (Shell_spriteblock *) r->reference;
- Error_Check( Sprite_Save( (sprite_area) spriteblock->areainfo, filename));
-
- return TRUE;
- }
-
-
- #define Min( a, b) ( (a) < (b) ) ? (a) : (b)
-
- static int Shell__SpriteRectRamSaver(
- task_handle sourcetask,
- Shell_rectblockptr r,
- task_handle desttask,
- void *destbuffer,
- unsigned int buffersize,
- int progress
- )
- {
- Shell_spriteblock *spriteblock = (Shell_spriteblock *) r->reference;
- char *data = ((char *) spriteblock->areainfo) + 4;
- int n;
-
- /* Find number of bytes to transfer */
- n = Min( spriteblock->areainfo->areasize-4/*first word isn't saved*/-progress, buffersize);
-
- Wimp_TransferBlock(
- sourcetask, data + progress,
- desttask, destbuffer,
- n
- );
- return n;
- }
-
-
-
- #define DEFAULT_NAME "NoName"
-
-
- Shell_rectblock *Shell_AddSpriteRect(
- Shell_windblock *wind,
- int x,
- int y,
- int xsize,
- int ysize
- )
- {
- int areasize;
- sprite_areainfo *areainfo;
- Shell_spriteblock *spriteblock;
- Shell_rectblock *r;
- wimp_point pixelsize;
-
- Screen_CacheModeInfo();
- pixelsize.x = xsize >> screen_eig.x;
- pixelsize.y = xsize >> screen_eig.y;
-
- areasize = sizeof( sprite_areainfo) + Sprite_MemorySize( pixelsize.x, pixelsize.y, screen_mode, sprite_HASNOMASKPAL);
- areainfo = (sprite_areainfo *) Shell_SafeMalloc( areasize);
-
- spriteblock = (Shell_spriteblock *) Shell_SafeMalloc( sizeof( Shell_spriteblock));
- spriteblock->areainfo = areainfo;
- spriteblock->sprite.name = DEFAULT_NAME;
-
- areainfo->areasize = areasize;
- areainfo->numsprites = 0;
- areainfo->firstoffset = 16;
- areainfo->freeoffset = 16;
- Sprite_InitArea( (sprite_area) areainfo);
-
- Sprite_Create( (sprite_area) areainfo, DEFAULT_NAME, 0/*no palette*/, pixelsize.x, pixelsize.y, screen_mode);
-
- r = Shell_AddRectangle3( wind, x, y, xsize, ysize, Shell__SpriteRedrawer, spriteblock);
- Shell_MakeRectIcon( r, colour_BLACK, colour_WHITE, "r1");
- r->saver = Shell__SpriteRectSaver;
- r->ramsaver = Shell__SpriteRectRamSaver;
- r->filetype = 0xff9;
- r->size = areasize - 4;
-
- return r;
-
- }
-
-
-
-